package model;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import components.Database;
import components.JSqlList;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JOptionPane;

/**
 *
 * @author Thierry
 */
public class Kind {
    
        private String naam, geslacht;
        //private int gbdag, gbmaand, gbjaar;
        private Date geboortedatum;
        private int oudercode;
        private DateFormat mysqlDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        
        //'lege' constructor
        public Kind()
        {
        }
        
        //'volle' constructor
        public Kind(String naam, Date gbdatum, String geslacht)
        {
            setNaam(naam);
            setGeboortedatum(gbdatum);
            setGeslacht(geslacht);
        }
        
        public static Kind[] getKinderen(String oudercode)
        {
            //voer query uit op de database  
            ResultSet r = Database.executeSelectQuery("select naam, gbdatum, geslacht, oudercode from kind where oudercode =" + oudercode);
            
            //sla straks de studentgegevens op in een arraylist
            ArrayList<Kind> kinderen = new ArrayList<Kind>();
            
            // haal de gegevens nu per kind op en stop ze in een Kind object
            try
            {
                while (r.next())
                {
                    Kind value = new Kind();
        
                    value.setNaam(r.getString("naam"));
                    value.setGeboortedatum(r.getDate("gbdatum"));
                    value.setGeslacht(r.getString("geslacht"));
                    value.oudercode = r.getInt("oudercode");
                    
                    //nu gaan de gegevens naar de arraylist
                    kinderen.add(value);
                }
            }
            catch (SQLException e)
            {
                JOptionPane.showMessageDialog(null,""+e.toString() + "\n" + e.getMessage() + "\n" + e.getSQLState() + "\n" + e.getErrorCode());
            }
            if(kinderen.size() == 0)
                JOptionPane.showMessageDialog(null,"Geen kinderen gevonden!");
            
            //nu je weet hoeveel kinderen er gevonden zijn kun je ze in een array stoppen
            Kind[] array = new Kind[kinderen.size()];
            for (int i = 0; i<kinderen.size() ; i++)
                array[i] = kinderen.get(i);
            return array;
        }
        
        public static int[] getLeeftijden()
        {
            //voer query uit op de database  
            ResultSet r = Database.executeSelectQuery("select gbdatum from kind");
            
            int leeftijden[] = new int[18];
            
            // haal de gegevens nu per kind op en stop ze in de array
            try
            {
                while (r.next())
                {
                    //maak van de geboortedatum een leeftijd en verhoog de waarde van bijbehorend array veld met 1
                    int leeftijd = leeftijd(r.getDate("gbdatum"));
                    
                    if (leeftijd<18 && leeftijd >= 0)
                    leeftijden[leeftijd(r.getDate("gbdatum"))]++;
                    
                }
            }
            catch (SQLException e)
            {
                JOptionPane.showMessageDialog(null,""+e.toString() + "\n" + e.getMessage() + "\n" + e.getSQLState() + "\n" + e.getErrorCode());
            }
            
            return leeftijden;
        }
        
        public boolean voegToe(){
            
            if (naam.isEmpty()){ //als naam niet is ingevuld, geef dan een waarschuwing
                JOptionPane.showMessageDialog(null,"Naam is niet ingevuld!");
                return false;
            }
                
            if (geboortedatum==null) //als geboortedatum niet is ingevuld, geef dan waarschuwing
                 return false;
            
            if (geslacht.isEmpty()){ //als geslacht niet is ingevuld, geef dan waarschuwing
                 JOptionPane.showMessageDialog(null,"Geslacht is niet ingevuld!");
                return false;
            }
            
            String query = "INSERT into kind VALUES ('"+naam+"','"+getGeboortedatumAsMysqlDate()+"','"+geslacht+"',"+oudercode+")";
            return (Database.executeInsertQuery(query) == 1);
        }
        
        public boolean werkBij(Kind vorige){
            
            if (naam.isEmpty()) //als naam niet is ingevuld, gebruik dan 'vorige' geboortedatum
                this.naam = vorige.getNaam();
            if (geboortedatum==null) //als geboortedatum niet is ingevuld, gebruik dan 'vorige' geboortedatum
                 this.geboortedatum=vorige.getGeboortedatum();
            if (geslacht.isEmpty()) //als geslacht niet is ingevuld, gebruik dan 'vorige' geslacht
                 this.geslacht=vorige.getGeslacht();
            
            String query = "UPDATE kind SET naam='"+naam+"', gbdatum='"+getGeboortedatumAsMysqlDate()+"', geslacht='"+geslacht+"' WHERE oudercode = '"+oudercode+"' AND naam='"+vorige.getNaam()+"' AND gbdatum='"+vorige.getGeboortedatumAsMysqlDate()+"'";
            return (Database.executeUpdateQuery(query) == 1);
        }
        
        public boolean verwijder() {
            String query = "delete from kind where naam ='"+naam+"' and gbdatum='"+getGeboortedatumAsMysqlDate()+"' and oudercode= "+oudercode;
            return (Database.executeDeleteQuery(query) == 1);
        }
        
        private static int leeftijd (Date geboortedatum) //geeft de leeftijd terug gebaseerd op de geboortedatum (maximum 18 jaar)
        {
            Date vandaag = new Date();
            int leeftijd = vandaag.getYear()-geboortedatum.getYear();
            
            if (geboortedatum.getMonth()>vandaag.getMonth())
                leeftijd--;
            
            if (geboortedatum.getMonth()==vandaag.getMonth() && geboortedatum.getDate()>vandaag.getDate())
                leeftijd--;
                        
            return leeftijd;
        }
        
        public static String getNaamOuder(int code)
        {
            //voer query uit op de database  
            ResultSet r = Database.executeSelectQuery("select naam from lid where code="+code);
            
            String naam = "";
            
            // haal de naam van de ouder op
            try
            {
                while (r.next())
                {
                    //maak van de geboortedatum een leeftijd en verhoog de waarde van bijbehorend array veld met 1
                    naam = r.getString("naam");
                 }
            }
            catch (SQLException e)
            {
                JOptionPane.showMessageDialog(null,""+e.toString() + "\n" + e.getMessage() + "\n" + e.getSQLState() + "\n" + e.getErrorCode());
            }
            
            return naam;
        }
        
        //getters en setters
        public void setNaam(String naam)
        {
            this.naam = naam;
        }
        
        public void setGeboortedatum(Date geboortedatum) {
            if (geboortedatum == null) {
                JOptionPane.showMessageDialog(null, "Datum ongeldig!");
            } else {
                try {
                    Date tenminste = mysqlDateFormat.parse("1950-1-1");
                    if (geboortedatum.after(tenminste)) {
                        this.geboortedatum = geboortedatum;
                    } else {
                        JOptionPane.showMessageDialog(null, "Datum moet na " + mysqlDateFormat.format(tenminste) + " liggen!", "error", JOptionPane.ERROR_MESSAGE);
                    }
                }
                catch (ParseException ex) {
                    JOptionPane.showMessageDialog(null,ex.getMessage());
                }
            }
        }
        
        public void setGeslacht(String geslacht)
        {
            this.geslacht = geslacht;
        }
        
        public void setOudercode(int oudercode) //oudercode moet niet gewijzigd kunnen worden
        {
            this.oudercode = oudercode;
        }
        
        public String getNaam()
        {
            return this.naam;
        }
        
        public Date getGeboortedatum() {
             return geboortedatum;
        }

        //niet standaard ivm formaat van de datum in de database
        private String getGeboortedatumAsMysqlDate() {
            return mysqlDateFormat.format(geboortedatum);
        }
        
        public int getGeboortedag()
        {
            return this.geboortedatum.getDate();
        }
        
        public int getGeboortemaand()
        {
            return this.geboortedatum.getMonth();
        }
        
        public int getGeboortejaar()
        {
            return this.geboortedatum.getYear();
        }
        
        public String getGeslacht()
        {
            return this.geslacht;
        }
        public int getOudercode()
        {
            return this.oudercode;
        }
        
        @Override
        //print de studentgegevens als tabel
         public String toString() {
            String output= "";
                output += JSqlList.setSpaces(getNaam(),25);
                output += JSqlList.setSpaces(getGeslacht(),10);
                output += ""+getGeboortedatum();
                return output;
         }
}
